<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Java多线程任务聚合技术详解</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css">
    <link rel="stylesheet" href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            color: #333;
            line-height: 1.6;
            background-color: #f8f9fa;
        }
        h1, h2, h3, h4 {
            font-family: 'Noto Serif SC', serif;
            font-weight: 600;
            color: #2d3748;
        }
        .hero {
            background: linear-gradient(135deg, #6b46c1 0%, #805ad5 100%);
            color: white;
        }
        .card {
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            background: white;
            border-radius: 0.5rem;
            overflow: hidden;
        }
        .card:hover {
            transform: translateY(-5px);
            box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
        }
        .method-icon {
            font-size: 2.5rem;
            color: #6b46c1;
            margin-bottom: 1rem;
        }
        .footer {
            background-color: #2d3748;
            color: #e2e8f0;
        }
        .footer a:hover {
            color: #a0aec0;
        }
        .highlight {
            background-color: #f6ad55;
            padding: 0.2rem 0.4rem;
            border-radius: 0.25rem;
        }
        .mermaid {
            background-color: white;
            padding: 1.5rem;
            border-radius: 0.5rem;
            box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
            margin: 2rem 0;
        }
    </style>
</head>
<body>
    <!-- Hero Section -->
    <section class="hero py-20 px-4 md:px-0 mb-16">
        <div class="container mx-auto max-w-5xl text-center">
            <h1 class="text-4xl md:text-5xl font-bold mb-6 leading-tight">Java多线程任务聚合技术</h1>
            <p class="text-xl md:text-2xl mb-8 opacity-90">高效管理并发任务，实现卓越性能</p>
            <div class="max-w-3xl mx-auto">
                <p class="text-lg opacity-85">在现代Java应用中，多线程编程是提升性能的关键。任务聚合技术帮助开发者优雅地管理并发任务，优化资源利用，提升系统吞吐量。本文将深入探讨Java中最常用的五种任务聚合方法及其最佳实践。</p>
            </div>
        </div>
    </section>

    <!-- Main Content -->
    <div class="container mx-auto max-w-5xl px-4 md:px-0 mb-20">
        <!-- Introduction -->
        <section class="mb-16">
            <div class="prose max-w-none">
                <h2 class="text-3xl font-bold mb-6 text-gray-800">任务聚合的核心概念</h2>
                <p class="text-lg leading-relaxed mb-6">任务聚合是多线程编程中的重要模式，它允许开发者<span class="highlight">等待多个并发任务完成</span>并将它们的结果汇总到一起。通过合理使用任务聚合技术，可以显著提升程序的并发性能和响应能力。</p>
                
                <p class="text-lg leading-relaxed mb-6">Java提供了多种强大的工具来实现任务聚合，每种工具都有其独特的适用场景和优势。了解这些工具的特点和差异，能帮助我们在实际开发中做出更明智的选择。</p>
                
                <div class="mermaid">
                    graph TD
                    A[任务聚合方法] --> B[CountDownLatch]
                    A --> C[CyclicBarrier]
                    A --> D[CompletableFuture]
                    A --> E[ForkJoinPool]
                    A --> F[ExecutorService]
                    B --> G[一次性使用]
                    C --> H[可重用]
                    D --> I[异步组合]
                    E --> J[分治策略]
                    F --> K[批量执行]
                </div>
            </div>
        </section>

        <!-- Methods Section -->
        <section class="mb-16">
            <h2 class="text-3xl font-bold mb-10 text-center text-gray-800">五大任务聚合方法详解</h2>
            
            <div class="grid md:grid-cols-2 gap-8">
                <!-- CountDownLatch -->
                <div class="card p-8">
                    <div class="text-center mb-6">
                        <div class="method-icon">
                            <i class="fas fa-lock-open"></i>
                        </div>
                        <h3 class="text-2xl font-bold mb-3">CountDownLatch</h3>
                    </div>
                    <p class="mb-4">允许一个或多个线程等待，直到在其他线程中执行的一组操作完成。适合需要等待多个子任务完成的场景。</p>
                    <div class="bg-gray-100 p-4 rounded-md mb-4">
                        <p class="font-mono text-sm text-gray-700">// 主线程中调用</p>
                        <p class="font-mono text-sm text-gray-700">latch.await();</p>
                        <p class="font-mono text-sm text-gray-700">// 子任务中调用</p>
                        <p class="font-mono text-sm text-gray-700">latch.countDown();</p>
                    </div>
                    <ul class="list-disc pl-5 space-y-2 text-gray-700">
                        <li>一次性使用，不可重置</li>
                        <li>简单直接的等待机制</li>
                        <li>计数器递减到0时释放等待线程</li>
                    </ul>
                </div>

                <!-- CyclicBarrier -->
                <div class="card p-8">
                    <div class="text-center mb-6">
                        <div class="method-icon">
                            <i class="fas fa-sync-alt"></i>
                        </div>
                        <h3 class="text-2xl font-bold mb-3">CyclicBarrier</h3>
                    </div>
                    <p class="mb-4">允许一组线程互相等待，直到它们都达到一个公共的屏障点。适合需要多个线程同步的场景。</p>
                    <div class="bg-gray-100 p-4 rounded-md mb-4">
                        <p class="font-mono text-sm text-gray-700">// 子任务中调用</p>
                        <p class="font-mono text-sm text-gray-700">barrier.await();</p>
                    </div>
                    <ul class="list-disc pl-5 space-y-2 text-gray-700">
                        <li>可重复使用，计数器自动重置</li>
                        <li>可以设置到达屏障后的回调操作</li>
                        <li>适用于分阶段任务处理</li>
                    </ul>
                </div>

                <!-- CompletableFuture -->
                <div class="card p-8">
                    <div class="text-center mb-6">
                        <div class="method-icon">
                            <i class="fas fa-project-diagram"></i>
                        </div>
                        <h3 class="text-2xl font-bold mb-3">CompletableFuture</h3>
                    </div>
                    <p class="mb-4">功能强大的工具，可以组合多个异步任务，并在所有任务完成后聚合结果。提供丰富的异步编程API。</p>
                    <div class="bg-gray-100 p-4 rounded-md mb-4">
                        <p class="font-mono text-sm text-gray-700">CompletableFuture.allOf(futures)</p>
                        <p class="font-mono text-sm text-gray-700">.thenApply(v -> futures.map(CompletableFuture::join))</p>
                        <p class="font-mono text-sm text-gray-700">.join();</p>
                    </div>
                    <ul class="list-disc pl-5 space-y-2 text-gray-700">
                        <li>支持链式调用和组合操作</li>
                        <li>提供异常处理机制</li>
                        <li>灵活的异步编程模型</li>
                    </ul>
                </div>

                <!-- ForkJoinPool -->
                <div class="card p-8">
                    <div class="text-center mb-6">
                        <div class="method-icon">
                            <i class="fas fa-code-branch"></i>
                        </div>
                        <h3 class="text-2xl font-bold mb-3">ForkJoinPool</h3>
                    </div>
                    <p class="mb-4">基于分治算法的并行执行框架，适用于将大任务分解为多个小任务并行处理。适合计算密集型任务。</p>
                    <div class="bg-gray-100 p-4 rounded-md mb-4">
                        <p class="font-mono text-sm text-gray-700">class Task extends RecursiveTask<T> {</p>
                        <p class="font-mono text-sm text-gray-700">  protected T compute() {</p>
                        <p class="font-mono text-sm text-gray-700">    // 分解任务并fork()</p>
                        <p class="font-mono text-sm text-gray-700">    // 使用join()聚合结果</p>
                        <p class="font-mono text-sm text-gray-700">  }</p>
                        <p class="font-mono text-sm text-gray-700">}</p>
                    </div>
                    <ul class="list-disc pl-5 space-y-2 text-gray-700">
                        <li>自动工作窃取(work-stealing)调度</li>
                        <li>适合递归分解的任务</li>
                        <li>内置的并行处理能力</li>
                    </ul>
                </div>
            </div>
        </section>

        <!-- Additional Methods -->
        <section class="mb-16">
            <div class="prose max-w-none">
                <h2 class="text-3xl font-bold mb-6 text-gray-800">其他任务聚合方法</h2>
                
                <!-- ExecutorService -->
                <div class="card p-8 mb-8">
                    <h3 class="text-2xl font-bold mb-4 flex items-center">
                        <i class="fas fa-tasks mr-3 text-purple-600"></i> ExecutorService与Future
                    </h3>
                    <p class="mb-4">通过ExecutorService提交多个任务，并使用Future来获取任务结果。适合批量执行并行任务。</p>
                    <div class="bg-gray-100 p-4 rounded-md mb-4">
                        <p class="font-mono text-sm text-gray-700">List<Future<T>> futures = executor.invokeAll(tasks);</p>
                        <p class="font-mono text-sm text-gray-700">for (Future<T> f : futures) {</p>
                        <p class="font-mono text-sm text-gray-700">  T result = f.get(); // 阻塞获取结果</p>
                        <p class="font-mono text-sm text-gray-700">}</p>
                    </div>
                    <ul class="list-disc pl-5 space-y-2 text-gray-700">
                        <li>简单的批量任务执行模型</li>
                        <li>通过Future.get()阻塞等待结果</li>
                        <li>适合固定数量任务的执行</li>
                    </ul>
                </div>
            </div>
        </section>

        <!-- Usage Patterns -->
        <section class="mb-16">
            <div class="prose max-w-none">
                <h2 class="text-3xl font-bold mb-6 text-gray-800">任务聚合的典型应用模式</h2>
                
                <div class="grid md:grid-cols-2 gap-8">
                    <div class="card p-6">
                        <h3 class="text-xl font-bold mb-4 flex items-center">
                            <i class="fas fa-hourglass-half mr-2 text-purple-600"></i> 等待所有任务完成
                        </h3>
                        <p>使用<code class="bg-gray-100 px-1 rounded">CountDownLatch</code>、<code class="bg-gray-100 px-1 rounded">CyclicBarrier</code>或<code class="bg-gray-100 px-1 rounded">CompletableFuture.allOf()</code>等待所有子任务完成，再聚合结果。</p>
                    </div>
                    
                    <div class="card p-6">
                        <h3 class="text-xl font-bold mb-4 flex items-center">
                            <i class="fas fa-chess-board mr-2 text-purple-600"></i> 分治法
                        </h3>
                        <p>使用<code class="bg-gray-100 px-1 rounded">ForkJoinPool</code>将大任务分解为小任务并行执行，最后汇总所有子任务的结果。</p>
                    </div>
                    
                    <div class="card p-6">
                        <h3 class="text-xl font-bold mb-4 flex items-center">
                            <i class="fas fa-link mr-2 text-purple-600"></i> 组合异步结果
                        </h3>
                        <p>使用<code class="bg-gray-100 px-1 rounded">CompletableFuture</code>链式调用，异步执行多个任务，并在所有任务完成后组合结果。</p>
                    </div>
                    
                    <div class="card p-6">
                        <h3 class="text-xl font-bold mb-4 flex items-center">
                            <i class="fas fa-clipboard-list mr-2 text-purple-600"></i> 批量任务提交与等待
                        </h3>
                        <p>使用<code class="bg-gray-100 px-1 rounded">ExecutorService</code>的<code class="bg-gray-100 px-1 rounded">invokeAll()</code>方法，批量提交任务并等待所有任务完成后获取结果。</p>
                    </div>
                </div>
            </div>
        </section>
    </div>

    <!-- Footer -->
    <footer class="footer py-8">
        <div class="container mx-auto max-w-5xl px-4 text-center">
            <div class="mb-4">
                <h3 class="text-xl font-medium">技术小馆</h3>
            </div>
            <div>
                <a href="http://www.yuque.com/jtostring" class="hover:underline">http://www.yuque.com/jtostring</a>
            </div>
        </div>
    </footer>

    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true,
                curve: 'basis'
            }
        });
    </script>
</body>
</html>